var mysql = require("mysql");
const { DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_DATABASE } = process.env;
var config = {
  host: DB_HOST,
  port: DB_PORT,
  user: DB_USER,
  password: DB_PASSWORD,
  database: DB_DATABASE,
};
var pool = mysql.createPool(config);

//异步查询
var asynquery = function (sql, values, callback) {
  pool.getConnection(function (err, conn) {
    if (err) {
      log.error(err);
      callback(err, null, null);
    } else {
      conn.query(sql, values, function (qerr, vals, fields) {
        //释放连接
        conn.release();
        //事件驱动回调
        callback(qerr, vals, fields);
      });
    }
  });
};
//同步查询
function query(sql, values) {
  // 返回一个 Promise
  return new Promise((resolve, reject) => {
    // getConnection 获取连接  回调函数中返回
    // err 连接是否失败
    // conncetion 获取连接的连接信息
    pool.getConnection(function (err, connection) {
      if (err) {
        console.log(err);
        reject(err);
      } else {
        // sql 查询的语句
        // values 查询过程中需要的数据
        // error  查询的错误信息
        // result 查询的结果
        connection.query(sql, values, (err, result) => {
          if (err) {
            reject(err);
          } else {
            // 将查询成功返回的数据 存入resolve中
            resolve(result);
          }
          // 结束会话
          connection.release();
        });
      }
    });
  });
}
function execute(sql, values) {
  // 返回一个 Promise
  return new Promise((resolve, reject) => {
    pool.getConnection(function (err, connection) {
      if (err) {
        log.error(err);
        reject(err);
      } else {
        connection.query(sql, values, (err, rows) => {
          if (err) {
            log.error(err);
            var error = {
              status: 500,
              message: err,
            };
            resolve(error);
          } else {
            var data = {
              status: 200,
              message: rows,
            };
            resolve(data);
          }
          // 结束会话
          connection.release();
        });
      }
    });
  });
}

//暴露方法需要加上{} 不加{}是指暴露属性

module.exports = { asynquery, query, config, execute };
